package main

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"log"
)

var ctx = context.Background()

func main() {
	// 创建redis客户端
	rdb := redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379", // redis服务器地址
		Password: "123456",         // 没有密码
		DB:       0,                // 默认数据库
	})

	// 添加用户分数
	err := AddUserScore(rdb, "user1", 100)
	if err != nil {
		log.Fatalf("无法添加用户分数: %v", err)
	}

	err = AddUserScore(rdb, "user2", 200)
	if err != nil {
		log.Fatalf("无法添加用户分数: %v", err)
	}

	err = AddUserScore(rdb, "user3", 150)
	if err != nil {
		log.Fatalf("无法添加用户分数: %v", err)
	}

	// 获取用户排名
	rank, err := GetUserRank(rdb, "user2")
	if err != nil {
		log.Fatalf("无法获取用户排名: %v", err)
	}
	fmt.Printf("user2 的排名为: %d\n", rank+1) // Redis 的排名是从0开始的，所以要加1

	// 获取某个范围内的用户排名
	users, err := GetUsersByRankRange(rdb, 0, 2)
	if err != nil {
		log.Fatalf("无法获取用户排名范围: %v", err)
	}
	fmt.Println("前3名用户为:")
	for i, user := range users {
		fmt.Printf("%d: %s\n", i+1, user)
	}
}

// AddUserScore 添加用户分数
func AddUserScore(rdb *redis.Client, userID string, score int) error {
	return rdb.ZAdd(ctx, "leaderboard", &redis.Z{
		Score:  float64(score),
		Member: userID,
	}).Err()
}

// GetUserRank 获取用户排名
func GetUserRank(rdb *redis.Client, userID string) (int64, error) {
	rank, err := rdb.ZRevRank(ctx, "leaderboard", userID).Result()
	if err == redis.Nil {
		return -1, fmt.Errorf("用户 %s 不存在", userID)
	}
	return rank, err
}

// GetUsersByRankRange 获取某个范围内的用户排名
func GetUsersByRankRange(rdb *redis.Client, start, stop int64) ([]string, error) {
	users, err := rdb.ZRevRange(ctx, "leaderboard", start, stop).Result()
	if err == redis.Nil {
		return nil, fmt.Errorf("没有找到用户")
	}
	return users, err
}
